const http = require('http');
// 引入对应的对象，这些对象的属性在对应的文件中以及处理了
// 然后在这里只需要在合适的时候添加在ctx对象上面就行了
const context = require("./context.js");
const request = require("./request.js");
const response = require("./response.js");

class Application {
  // 监听函数
  listen(...args) {
    // 使用原生的 node http 模块创建服务
    const server = http.createServer((req, res) => {
      const ctx = this.createContext(req, res);

      // 调用需要执行的回调函数
      this.callback(ctx);

      // 响应数据
      res.end(ctx.body);
    })
    server.listen(...args);
  }
  // 创建上下文
  createContext(req, res) {
    // 创建上下文对象
    // 并且给上下文添加 request 和 response 对象
    const ctx = Object.create(context);
    ctx.request = Object.create(request);
    ctx.response = Object.create(response);

    // 将传入的 req 和 res 赋值给上下文对应的属性
    ctx.req = req;
    ctx.request.req = req;

    ctx.res = res;
    ctx.response.res = res;

    // 返回上下文对象
    return ctx;
  }
  // 注册中间件
  use(callback) {
    this.callback = callback;
  }
}

module.exports = Application;
